home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Interactive Reference Guide
/
C-C++ Interactive Reference Guide.iso
/
c_ref
/
csource5
/
343_01
/
djet.c
< prev
next >
Wrap
Text File
|
1990-09-08
|
24KB
|
895 lines
/********************************************************
*
* file d:\cips\djet.c
*
* Functions: This file contains
* end_graphics_mode
* get_graphics_caption
* print_bytes
* print_graphics_image
* print_original_200_row
* select_300_dpi_resolution
* select_full_graphics_mode
* set_horizontal_offset
* set_raster_width
* start_raster_graphics
*
* Purpose:
* These functions print a 200x200 image using
* dithering to an HP DeskJet or compatable (Laserjet).
* This uses an 8x8 matrix which gives 64 shades of
* gray.
*
* External Calls:
* rtiff.c - read_tiff_image
* hist.c - zero_histogram
* calculate_histogram
* perform_histogram_equalization
*
*
* Modifications:
* January 1991 - created
* 25 August 1991 - modified for use in the
* C Image Processing System.
*
┌─────┐ ┌─────┐
│ │ │ │ The function print_graphics_image
│ │ │ │ begins with 2 100x100 image arrays
│ │ │ │
│ │ │ │
└─────┘ └─────┘
┌───────────────┐
│ │ It joins them into
│ │ 1 100x200 image array
│ │
│ │
└───────────────┘
┌───────────────┐
└───────────────┘
┌───────────────┐
└───────────────┘
. It loops and creates
. 100 200 element image arrays
.
┌───────────────┐
└───────────────┘
The function print_original_200_row receives a 200
element array
┌┬──────────────────────────┬┐
└┴──────────────────────────┴┘
This array is transformed into a 8x200 array of
characters called 'row'
┌───────── ... ■───────┐
├───────── ... ■───────┤
├───────── ... ■───────┤
├───────── ... ■───────┤
├───────── ... ■───────┤
├───────── ... ■───────┤
├───────── ... ■───────┤
├───────── ... ■───────┤
└───────── ... ■───────┘
Each column of this array is a 1x8 character array which
is an 8-bit x 8-bit array
╔══╗
║ ║
╚══╝
Each row of 'row' is passed to the funnction print_bytes
for graphics printing
********************************************************/
#include "d:\cips\cips.h"
#define ESCAPE 27
#define FORMFEED '\014'
short r[200];
/*******************************************
*
* The patterns array holds the rows to the
* 8x8 matrices used for printing
* shades of gray.
*
********************************************/
char patterns[64][8] =
{ {255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 127},
{255, 255, 255, 255, 255, 255, 255, 63},
{255, 255, 255, 255, 255, 255, 255, 31},
{255, 255, 255, 255, 255, 255, 255, 15},
{255, 255, 255, 255, 255, 255, 255, 7},
{255, 255, 255, 255, 255, 255, 255, 3},
{255, 255, 255, 255, 255, 255, 255, 1},
{255, 255, 255, 255, 255, 255, 255, 0},
{255, 255, 255, 255, 255, 255, 127, 0},
{255, 255, 255, 255, 255, 255, 63, 0},
{255, 255, 255, 255, 255, 255, 31, 0},
{255, 255, 255, 255, 255, 255, 15, 0},
{255, 255, 255, 255, 255, 255, 7, 0},
{255, 255, 255, 255, 255, 255, 3, 0},
{255, 255, 255, 255, 255, 255, 1, 0},
{255, 255, 255, 255, 255, 255, 0, 0},
{255, 255, 255, 255, 255, 127, 0, 0},
{255, 255, 255, 255, 255, 63, 0, 0},
{255, 255, 255, 255, 255, 31, 0, 0},
{255, 255, 255, 255, 255, 15, 0, 0},
{255, 255, 255, 255, 255, 7, 0, 0},
{255, 255, 255, 255, 255, 3, 0, 0},
{255, 255, 255, 255, 255, 1, 0, 0},
{255, 255, 255, 255, 255, 0, 0, 0},
{255, 255, 255, 255, 127, 0, 0, 0},
{255, 255, 255, 255, 63, 0, 0, 0},
{255, 255, 255, 255, 31, 0, 0, 0},
{255, 255, 255, 255, 15, 0, 0, 0},
{255, 255, 255, 255, 7, 0, 0, 0},
{255, 255, 255, 255, 3, 0, 0, 0},
{255, 255, 255, 255, 1, 0, 0, 0},
{255, 255, 255, 255, 0, 0, 0, 0},
{255, 255, 255, 127, 0, 0, 0, 0},
{255, 255, 255, 63, 0, 0, 0, 0},
{255, 255, 255, 31, 0, 0, 0, 0},
{255, 255, 255, 15, 0, 0, 0, 0},
{255, 255, 255, 7, 0, 0, 0, 0},
{255, 255, 255, 3, 0, 0, 0, 0},
{255, 255, 255, 1, 0, 0, 0, 0},
{255, 255, 255, 0, 0, 0, 0, 0},
{255, 255, 127, 0, 0, 0, 0, 0},
{255, 255, 63, 0, 0, 0, 0, 0},
{255, 255, 31, 0, 0, 0, 0, 0},
{255, 255, 15, 0, 0, 0, 0, 0},
{255, 255, 7, 0, 0, 0, 0, 0},
{255, 255, 3, 0, 0, 0, 0, 0},
{255, 255, 1, 0, 0, 0, 0, 0},
{255, 255, 0, 0, 0, 0, 0, 0},
{255, 127, 0, 0, 0, 0, 0, 0},
{255, 63, 0, 0, 0, 0, 0, 0},
{255, 31, 0, 0, 0, 0, 0, 0},
{255, 15, 0, 0, 0, 0, 0, 0},
{255, 7, 0, 0, 0, 0, 0, 0},
{255, 3, 0, 0, 0, 0, 0, 0},
{255, 1, 0, 0, 0, 0, 0, 0},
{255, 0, 0, 0, 0, 0, 0, 0},
{127, 0, 0, 0, 0, 0, 0, 0},
{ 63, 0, 0, 0, 0, 0, 0, 0},
{ 31, 0, 0, 0, 0, 0, 0, 0},
{ 15, 0, 0, 0, 0, 0, 0, 0},
{ 7, 0, 0, 0, 0, 0, 0, 0},
{ 3, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0}};
print_graphics_image(image1, image2, image_name,
il, ie, ll, le, image_colors,
invert, caption, show_hist,
color_transform)
char caption[], image_name[], color_transform[];
int image_colors, invert,
il, ie, ll, le, show_hist;
short image1[ROWS][COLS], image2[ROWS][COLS];
{
char c[80],
page[80];
FILE *printer;
int i,
j;
unsigned long histogram[256], final_hist[256];
printer = fopen("prn", "w");
/**********************************************
*
* Print a few blank lines on the page.
*
***********************************************/
strcpy(page, " ");
my_fwriteln(printer, page);
my_fwriteln(printer, page);
/*****************************************************
*
* Read in two image arrays.
*
******************************************************/
printf("\nReading image");
read_tiff_image(image_name, image1, il, ie, ll, le);
printf("\nReading image");
read_tiff_image(image_name, image2, il, ie+100, ll, le+100);
/*****************************************************
*
* If show_hist is 1 OR do hist equalization
* then zero the histogram and
* calculate it for the two image arrays.
*
******************************************************/
if( (show_hist == 1) ||
(color_transform[0] == 'H')){
zero_histogram(histogram);
zero_histogram(final_hist);
printf("\nDJET> Calculating histograms");
calculate_histogram(image1, histogram);
calculate_histogram(image2, histogram);
}
/**************************************************
*
* Alter the images to 64 gray shades.
* Either do it with straight multiply
* and divide or use hist equalization.
*
* If using hist equalization then you must
* also read and calculate the hist for
* the other two image arrays that will be
* printed.
*
***************************************************/
if(color_transform[0] == 'S'){
if(image_colors == 256){
for(i=0; i<ROWS; i++){
for(j=0; j<COLS; j++){
image1[i][j] = image1[i][j]/4;
image2[i][j] = image2[i][j]/4;
}
}
} /* ends if image_colors == 256 */
if(image_colors == 16){
for(i=0; i<ROWS; i++){
for(j=0; j<COLS; j++){
image1[i][j] = image1[i][j]*4;
image2[i][j] = image2[i][j]*4;
}
}
} /* ends if image_colors == 16 */
} /* ends if color_transform == S */
if(color_transform[0] == 'H'){
printf("\nReading image");
read_tiff_image(image_name, image1, il+100, ie, ll+100, le);
printf("\nReading image");
read_tiff_image(image_name, image2,
il+100, ie+100, ll+100, le+100);
printf("\nDJET> Calculating histograms");
calculate_histogram(image1, histogram);
calculate_histogram(image2, histogram);
printf("\nReading image");
read_tiff_image(image_name, image1, il, ie, ll, le);
printf("\nReading image");
read_tiff_image(image_name, image2, il, ie+100, ll, le+100);
printf("\nDJET> Equalizing histogram");
perform_histogram_equalization(image1, histogram,
64.0, 40000.0);
printf("\nDJET> Equalizing histogram");
perform_histogram_equalization(image2, histogram,
64.0, 40000.0);
printf("\nDJET> Calculating histograms");
calculate_histogram(image1, final_hist);
calculate_histogram(image2, final_hist);
} /* ends if color_transform == H */
/************************************************
*
* If invert is set them invert the transformed
* image arrays (they now only have 64 shades
* of gray).
*
*************************************************/
if(invert == 1){
for(i=0; i<ROWS; i++){
for(j=0; j<COLS; j++){
image1[i][j] = 63 - image1[i][j];
image2[i][j] = 63 - image2[i][j];
}
}
}
/**************************************************
*
* Now set the graphics mode on the printer
*
***************************************************/
printf("\nBegin");
end_graphics_mode(printer);
select_300_dpi_resolution(printer);
set_raster_width(printer);
start_raster_graphics(printer);
select_full_graphics_mode(printer);
/**************************************************
*
* Print the two arrays to make a 100x200 output.
* To do this you loop over 100 rows, set the
* r buffer to the image values, set the
* graphics, and print the row via function
* print_original_200_row.
*
***************************************************/
for(i=0; i<100; i++){
for(j=0; j<100; j++){
r[j] = image1[i][j];
r[j+100] = image2[i][j];
} /* ends loop over j */
end_graphics_mode(printer);
select_300_dpi_resolution(printer);
set_raster_width(printer);
start_raster_graphics(printer);
select_full_graphics_mode(printer);
print_original_200_row(printer, r);
printf("\n\tPrinting row %d", i);
} /* ends loop over i */
/* ends first half */
/*****************************************************
*
* In order to print 200x200 repeat
* the above steps for 2 more 100x100 arrays
*
******************************************************/
printf("\nReading image");
read_tiff_image(image_name, image1, il+100, ie, ll+100, le);
printf("\nReading image");
read_tiff_image(image_name, image2,
il+100, ie+100, ll+100, le+100);
/**************************************************
*
* Alter the images to 64 shades of gray.
*
* Either do it with straight multiply
* and divide or use hist equalization.
*
***************************************************/
if(color_transform[0] == 'S'){
if(image_colors == 256){
for(i=0; i<ROWS; i++){
for(j=0; j<COLS; j++){
image1[i][j] = image1[i][j]/4;
image2[i][j] = image2[i][j]/4;
}
}
} /* ends if image_colors == 256 */
if(image_colors == 16){
for(i=0; i<ROWS; i++){
for(j=0; j<COLS; j++){
image1[i][j] = image1[i][j]*4;
image2[i][j] = image2[i][j]*4;
}
}
} /* ends if image_colors == 16 */
} /* ends if color_transform == S */
if(color_transform[0] == 'H'){
printf("\nDJET> Equalizing histogram");
perform_histogram_equalization(image1, histogram,
64.0, 40000.0);
printf("\nDJET> Equalizing histogram");
perform_histogram_equalization(image2, histogram,
64.0, 40000.0);
printf("\nDJET> Calculating histograms");
calculate_histogram(image1, final_hist);
calculate_histogram(image2, final_hist);
} /* ends if color_transform == S */
/************************************************
*
* If invert is set them invert the transformed
* image arrays (they now only have 64 shades
* of gray).
*
*************************************************/
if(invert == 1){
for(i=0; i<ROWS; i++){
for(j=0; j<COLS; j++){
image1[i][j] = 63 - image1[i][j];
image2[i][j] = 63 - image2[i][j];
}
}
}
printf("\nBegin");
end_graphics_mode(printer);
select_300_dpi_resolution(printer);
set_raster_width(printer);
start_raster_graphics(printer);
select_full_graphics_mode(printer);
/**************************************************
*
* Print the two arrays to make a 100x200 output.
* To do this you loop over 100 rows, set the
* r buffer to the image values, set the
* graphics, and print the row via function
* print_original_200_row.
*
***************************************************/
for(i=0; i<100; i++){
for(j=0; j<100; j++){
r[j] = image1[i][j];
r[j+100] = image2[i][j];
} /* ends loop over j */
end_graphics_mode(printer);
select_300_dpi_resolution(printer);
set_raster_width(printer);
start_raster_graphics(printer);
select_full_graphics_mode(printer);
print_original_200_row(printer, r);
printf("\n\tPrinting row %d", i);
} /* ends loop over i */
/*****************************************************
*
* If show_hist is 1 then calculate the histogram
* for the two image arrays and print the histogram.
*
******************************************************/
if(show_hist == 1){
if(color_transform[0] == 'S'){
calculate_histogram(image1, histogram);
calculate_histogram(image2, histogram);
print_hist_image(printer, histogram);
}
if(color_transform[0] == 'H'){
print_hist_image(printer, final_hist);
}
}
/**************************************************
*
* Print a couple of blank lines then print
* the caption.
*
***************************************************/
end_graphics_mode(printer);
strcpy(page, " ");
my_fwriteln(printer, page);
my_fwriteln(printer, page);
sprintf(page, " %s", caption);
my_fwriteln(printer, page);
putc(FORMFEED, printer);
fclose(printer);
printf("\nEnd");
} /* ends print_graphics_image */
/****************************************************
*
* get_graphics_caption(...
*
****************************************************/
get_graphics_caption(caption)
char caption[];
{
printf("\nEnter the caption to be printed\n---");
read_string(caption);
} /* ends get_graphics_caption */
select_full_graphics_mode(printer)
FILE *printer;
{
putc(ESCAPE, printer);
putc('*', printer);
putc('b', printer);
putc('0', printer);
putc('M', printer);
}
set_horizontal_offset(printer)
FILE *printer;
{
putc(ESCAPE, printer);
putc('*', printer);
putc('b', printer);
putc('4', printer);
putc('9', printer);
putc('6', printer);
putc('X', printer);
}
set_shorter_horizontal_offset(printer)
FILE *printer;
{
putc(ESCAPE, printer);
putc('*', printer);
putc('b', printer);
putc('4', printer);
putc('8', printer);
putc('0', printer);
putc('X', printer);
}
end_graphics_mode(printer)
FILE *printer;
{
putc(ESCAPE, printer);
putc('*', printer);
putc('r', printer);
putc('B', printer);
}
set_raster_width(printer)
FILE *printer;
{
putc(ESCAPE, printer);
putc('*', printer);
putc('r', printer);
putc('2', printer);
putc('2', printer);
putc('0', printer);
putc('0', printer);
putc('S', printer);
}
start_raster_graphics(printer)
FILE *printer;
{
putc(ESCAPE, printer);
putc('*', printer);
putc('r', printer);
putc('0', printer);
putc('A', printer);
}
select_300_dpi_resolution(printer)
FILE *printer;
{
putc(ESCAPE, printer);
putc('*', printer);
putc('t', printer);
putc('3', printer);
putc('0', printer);
putc('0', printer);
putc('R', printer);
}
print_bytes(printer, buffer)
FILE *printer;
char buffer[];
{
int i;
putc(ESCAPE, printer);
putc('*', printer);
putc('b', printer);
putc('2', printer);
putc('0', printer);
putc('0', printer);
putc('W', printer);
for(i=0; i<200; i++){
putc(buffer[i], printer);
}
} /* ends print_bytes */
/**************************************************
*
* print_original_200_row(...
*
***************************************************/
print_original_200_row(printer, short_row)
FILE *printer;
short short_row[200];
{
char row[8][200];
char c[200], response[80];
int i, j, k;
short value;
for(i=0; i<200; i++){
value = short_row[i];
if(value > 63) value = 63;
if(value < 0) value = 0;
for(j=0; j<8; j++)
row[j][i] = patterns[value][j];
} /* ends loop over i */
for(i=0; i<8; i++){
for(j=0; j<200; j++)
c[j] = row[i][j];
set_horizontal_offset(printer);
print_bytes(printer, c);
} /* ends loop over i */
} /* ends print_original_200_row */
/***********************************
*
* print_hist_image(...
*
************************************/
print_hist_image(printer, hist)
FILE *printer;
unsigned long hist[];
{
char c, d;
int i, j, k;
unsigned long limit, max;
d = 0;
c = 255;
/********************************
*
* First scale the histogram
*
*********************************/
max = 0;
for(i=0; i<256; i++)
if(hist[i] > max) max = hist[i];
if(max > 200){
for(i=0; i<256; i++){
hist[i] = (hist[i]*200)/max;
}
}
/********************************
*
* Second print it
*
* Print a space between the image
* and the histogram.
*
*********************************/
for(i=0; i<20; i++){
end_graphics_mode(printer);
select_300_dpi_resolution(printer);
set_raster_width(printer);
start_raster_graphics(printer);
select_full_graphics_mode(printer);
set_horizontal_offset(printer);
putc(ESCAPE, printer);
putc('*', printer);
putc('b', printer);
putc('2', printer);
putc('0', printer);
putc('0', printer);
putc('W', printer);
for(j=0; j<200; j++)
putc(d, printer);
}
printf("\n\nHIST> Now printing the histogram");
for(i=0; i<256; i++){
printf("\n\tHIST> Histogram[%d]=%ld", i, hist[i]);
/* print the line 2 times */
for(k=0; k<2; k++){
end_graphics_mode(printer);
select_300_dpi_resolution(printer);
set_raster_width(printer);
start_raster_graphics(printer);
select_full_graphics_mode(printer);
/***************************
*
* Print grid marks every
* 50 pixels. Do this by
* setting a shorter margin
* then printing 2 marks then
* the data.
*
****************************/
if( (i == 0) ||
(i == 50) ||
(i == 100) ||
(i == 150) ||
(i == 200) ||
(i == 255)){
set_shorter_horizontal_offset(printer);
putc(ESCAPE, printer);
putc('*', printer);
putc('b', printer);
putc('2', printer);
putc('0', printer);
putc('2', printer);
putc('W', printer);
putc(c, printer);
putc(c, printer);
if(hist[i] >= 200)
hist[i] = 200;
limit = 200 - hist[i];
if(hist[i] == 0)
putc(c, printer);
for(j=0; j<hist[i]; j++)
putc(c, printer);
for(j=0; j<limit; j++)
putc(d, printer);
} /* ends print grid marks */
/***************************
*
* If you do not print
* grid marks, set the normal
* margin and then print the
* data.
*
****************************/
else{
set_horizontal_offset(printer);
/* this prints 200 bytes so print 200 */
putc(ESCAPE, printer);
putc('*', printer);
putc('b', printer);
putc('2', printer);
putc('0', printer);
putc('0', printer);
putc('W', printer);
if(hist[i] >= 200)
hist[i] = 200;
limit = 200 - hist[i];
if(hist[i] == 0)
putc(c, printer);
for(j=0; j<hist[i]; j++)
putc(c, printer);
for(j=0; j<limit; j++)
putc(d, printer);
} /* ends else no grid marks */
} /* ends loop over k */
} /* ends loop over i */
} /* ends print_hist_image */